package com.atguigu.connection;

import org.junit.Test;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author admin
 */
public class ConnectionTest {

    /**
     * 方式一
     */
    @Test
    public void testConnection1() throws SQLException {
        // 获取 Driver 实现类对象
        Driver driver = new com.mysql.jdbc.Driver();

        /*
            jdbc:mysql  协议
            localhost   ip 地址
            3306    MySQL 数据库默认端口
            atguigu_jdbc    连接的数据库名称
         */
        String url = "jdbc:mysql://localhost:3306/atguigu_jdbc";

        // 将用户名和密码封装在 Properties 中
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "123456");

        Connection connect = driver.connect(url, info);

        System.out.println(connect);

    }

    /**
     * 方式二：对方式一的迭代：在如下的程序中不出现第三方api，使得程序具有更好的移植性
     */
    @Test
    public void testConnection2() throws Exception {
        // 1.获取 Driver 实现类对象，使用反射
        Class clazz = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();

        // 2.提供有链接的数据库
        String url = "jdbc:mysql://localhost:3306/atguigu_jdbc";

        // 3. 提供连接需要的用户名和密码
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "123456");

        // 4.获取连接
        Connection connect = driver.connect(url, info);
        System.out.println(connect);

    }

    /**
     * 方式三：使用 DriverManager 替换 Driver
     */
    @Test
    public void testConnection3() throws Exception {

        // 1.获取 driver 实现类对象
        Class clazz = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();

        // 2.获取另外三个连接信息
        String url = "jdbc:mysql://localhost:3306/atguigu_jdbc";
        String user = "root";
        String password = "123456";

        // 注册驱动
        DriverManager.registerDriver(driver);

        // 获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);

    }

    /**
     * 方式四：可以只是加载驱动，不用显示的注册驱动
     */
    @Test
    public void testConnection4() throws Exception {

        // 1.获取另外三个连接信息
        String url = "jdbc:mysql://localhost:3306/atguigu_jdbc";
        String user = "root";
        String password = "123456";

        // 2.加载 driver
        Class.forName("com.mysql.jdbc.Driver");
        // 相较于方式三，可以省略如下操作
        // Driver driver = (Driver) clazz.newInstance();
        // 注册驱动
        // DriverManager.registerDriver(driver);

        // 为什么可以省略上述操作？
        /*
            在 MySQL 的 Driver 实现类中，声明了如下操作：
            static {
                try {
                    DriverManager.registerDriver(new Driver());
                } catch (SQLException var1) {
                    throw new RuntimeException("Can't register driver!");
                }
            }
         */

        // 3.获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);

    }

    /**
     * 方式五(final版)：将数据库连接需要的4个基本信息声明在配置文件中，通过读取配置文件的方式，获取连接
     * 此种方式的好处？
     * 1.实现了数据与代码的分离，实现了解耦
     * 2.如果需要修改配置文件信息，可以避免程序重新打包
     */
    @Test
    public void testConnection5() throws Exception {

        // 1.读取配置文件中的4个基本信息
        InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");

        Properties properties = new Properties();
        properties.load(is);

        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");

        // 2.加载驱动
        Class.forName(driver);

        // 3.获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);

    }
}
